{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([\n",
    "    [5, 1],   # 用户1==>对应标签 0\n",
    "    [4, 2],   # 用户2==>对应标签 0\n",
    "    [2, 5],   # 用户3==>对应标签 1\n",
    "    [1, 4],   # 用户4==>对应标签 1\n",
    "    [3, 2],   # 用户5==>对应标签 0\n",
    "    [2, 5]    # 用户6==>对应标签 1\n",
    "])\n",
    "# 0表示动作片，1表示喜剧片\n",
    "y = np.array([0, 0, 1, 1, 0, 1])  \n",
    "\n",
    "# 增加一个文字标签，在之后的程序中用于方便显示预测结果使用\n",
    "labels = ['动作片', '喜剧片']  \n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建K近邻分类器模型，设置最近邻的数量为1\n",
    "knn = KNeighborsClassifier(n_neighbors=1)\n",
    "\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-3 {color: black;background-color: white;}#sk-container-id-3 pre{padding: 0;}#sk-container-id-3 div.sk-toggleable {background-color: white;}#sk-container-id-3 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-3 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-3 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-3 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-3 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-3 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-3 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-3 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-3 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-3 div.sk-item {position: relative;z-index: 1;}#sk-container-id-3 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-3 div.sk-item::before, #sk-container-id-3 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-3 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-3 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-3 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-3 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-3 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-3 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-3 div.sk-label-container {text-align: center;}#sk-container-id-3 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-3 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y) # 使用样本数据和对应的标签训练模型"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，动作片为紫色，喜剧片为黄色\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "plt.plot(new_user[0,0], new_user[0,1], 'rx', markersize=8)\n",
    "\n",
    "# 新数据最近邻索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0][0]] # 获取最近邻点的坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "plt.plot([new_user[0,0], nearest[0]], [new_user[0,1], nearest[1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
